/*
 * CampaniaXml.h
 *
 * Author: Grupo Nro.
 */

#ifndef CAMPANIAXML_H_
#define CAMPANIAXML_H_

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <map>
#include "tinyxml2.h"
#include "Campania.h"
#include "Nivel.h"
#include "ConstantesCampaniaXml.h"
#include "Utils.h"
#include "Properties.h"
#include "ParserException.h"
#include "MapObjectFactory.h"
#include "MapObject.h"
#include "Plant.h"
#include "Spawner.h"
#include "../common/SharedConstants.h"
//#include "SharedConstants.h"
#include "EnemySpawner.h"

using std::string;
using std::vector;
using std::map;
using std::pair;

class CampaniaXml {
private:
	 tinyxml2::XMLDocument documento;
	 string nombreDocumento;
	 vector<Campania*> campanias;
	 void cargarDatos();
	 Campania * convertirACampania(tinyxml2::XMLElement* elementoCampania);
	 Nivel * convertirANivel(tinyxml2::XMLElement* elementoNivel);
	 void agregarCampaniaXml(Campania * campania);
	 void agregarNivelesXml(tinyxml2::XMLElement * elementoBase,
	 		map<int, Nivel*> secuenciasNiveles);
	 void agregarMapObjectsXml(tinyxml2::XMLElement * elementoBase,
	 		vector<MapObject*> & map_objects);
	 void agregarPlantsXml(tinyxml2::XMLElement * elementoBase,
	 		vector<Plant*> & plants);
	 void agregarSpawnersXml(tinyxml2::XMLElement * elementoBase,
	 		vector<Spawner*> & spawners);
	 void agregarTileMapXml(tinyxml2::XMLElement * elementoBase,
	 		string & tileMap);
	 void agregarNivelXml(tinyxml2::XMLElement * elementoBase,
	 		int secuenciaNivel, Nivel & nivel);
	 void creacionEstructuraInicial();
	 void agregarBombermanSpawnersXml(tinyxml2::XMLElement * elementoBase,
			 vector<pair<int, int> >& bombermanSpawnPoints);

public:
	CampaniaXml();
	CampaniaXml(string nombreArchivo);
	virtual ~CampaniaXml();
	void grabar();
	vector<Campania*> & getCampanias();
	void addCampania(Campania * campania);
	void deleteCampania(int idCampania);
	void addNivel(int idCampania, Nivel * nivel, int nroOrdenSecuenciaNivel);
	void deleteNivel(int idCampania, int idNivel);
};

#endif /* CAMPANIAXML_H_ */
